<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    解构赋值的规则是:只要等号右边的值不是对象或数组，就先将其转为对象。
    由于undefined和null无法转为对象，所以对它们进行解构赋值，都会报错。
    <script>
        // <!-- 数字 布尔值 -->
        //数组的解构赋值{}
        // 特性  分析结构 ---进行赋值

        //模式匹配  ---按照模式[层级顺序进行赋值]
        var [a,b,c]=[12,"你还",89];
        console.log(a,b,c);
        //缺少模式匹配    ---左边跳过 右边也跳过 
                    //   ---左边赋值为空  右边 空着   
        var [x,y,z]=[12,,89];
        console.log(x,y,z);
        var [x1,,z1]=[12,777,"喜欢"];
        console.log(x1,z1);
        //...匹配   ---前面正常陪陪   后面剩下化为数组 赋值 ...变量
        var [a1,b1,...c1]=[12,"你还",89,45,788,9];
        console.log(a1,b1,c1);

        // 如果解构不成功，对应的变量的值就等于undefined
        var [f]=[]; //f=undefined
        //不完全解构  --左侧匹配右侧一部分
        var [aa,[bb],cc]=[12,[45,55],78,56]

        //如果等号的右边不是数组（或者严格地说，不是可遍历的结构），那么将会报错。
        // 数字 布尔值 null undefinde {} NaN

        //默认值
        var [xx,yy="你好"]=[12,undefined]
        console.log(xx,yy);
        //此时 yy=45  45!==undefind  默认值无效
        // var [xx,yy="你好"]=[12,undefind] [或者为空] 默认值有效

        //默认值是函数[表达式]  只有使用才会执行 不然使用匹配的值
        function a(){
            console.log("aa");
        }
        let [qq=a()]=[12];//----当12位undefinded 时候才会执行函数a()
        //默认值可以引用解构赋值的其他变量，但该变量必须已经声明。
        let [x=12,y=x]=[1]; // x=1 y=1
        let [x=y,y=1]=[1,2]; // 宝座  y还没有生命



</script>



</body>
</html>